#include "Globo.h"
#include <iostream>
#include "windows.h"
#include "../red/ParseadorMensajes.h"
Globo::Globo(double x, double y, double ancho, double alto, string pathImagen) :
		Elemento(x, y, ancho, alto, pathImagen) {
	this->posSogaX = ancho / 2;
	this->posSogaY = alto;
	this->sogaUnida = NULL;
	this->sogaInicial = true;
	this->pinchado = false;
}

Globo::~Globo() {
}

void Globo::mover(double centroX, double centroY) {
	Elemento::mover(centroX, centroY);
	if (this->sogaUnida != NULL) {
		if (this->sogaInicial) {
			this->sogaUnida->setPosicionInicial(this->getX() + this->posSogaX,
					this->getY() + this->posSogaY);
		} else {
			this->sogaUnida->setPosicionFinal(this->getX() + this->posSogaX,
					this->getY() + this->posSogaY);
		}
	}
}

void Globo::agregarSogaInicial(Elemento* soga) {
	cout << "AGREGO SOGA A GLOBO CON X: " << this->getX() + this->posSogaX
			<< " E Y: " << this->getY() + this->posSogaY << endl;
	soga->setPosicionInicial(this->getX() + this->posSogaX,
			this->getY() + this->posSogaY);
	this->sogaUnida = soga;
	this->sogaInicial = true;
}

void Globo::agregarSogaFinal(Elemento* soga) {
	soga->setPosicionFinal(this->getX() + this->posSogaX,
			this->getY() + this->posSogaY);
	this->sogaUnida = soga;
	this->sogaInicial = false;
}

void Globo::rotar(double angulo) {
}

bool Globo::aceptaSoga() {
	if (this->sogaUnida)
		return false;
	return true;
}

void Globo::eliminarSoga(Elemento* soga) {
	cout << "antes elimino soga lgobo con id " << this->getIdElemento() << endl;
	this->sogaUnida = NULL;
	cout << "desp elimino soga lgobo   id " << this->getIdElemento() << endl;
}

int Globo::seSuperpone(Elemento* elemento) {
	if (elemento->getTipo() == "soga")
		return 0;
	return 2;
}

void Globo::eliminarReferencias(list<Elemento*>* elementosCanvas) {
	pair<Elemento*, Elemento*> extremosSoga;
	Elemento* aBorrar = this->sogaUnida;
	ParseadorMensajes parseador;
	if (this->sogaUnida) {
		cout << "elimino referencias de globo id: " << this->getIdElemento()
				<< " Y MEMORIA: " << this << " con soga id: "
				<< this->sogaUnida->getIdElemento() << " y memoeria: "
				<< this->sogaUnida << endl;
		cout << "Soga Unida: " << parseador.parsearElemento(this->sogaUnida)
				<< endl;
		elementosCanvas->remove(this->sogaUnida);
		extremosSoga = this->sogaUnida->obtenerExtremos();
		cout << "Extremos soga id1: " << extremosSoga.first->getIdElemento()
				<< " y id2: " << extremosSoga.second->getIdElemento() << endl;
		if (extremosSoga.first->getIdElemento() == this->getIdElemento()) {
			extremosSoga.second->eliminarSoga(this->sogaUnida);
			extremosSoga.first->eliminarSoga(this->sogaUnida);
		} else {
			extremosSoga.first->eliminarSoga(this->sogaUnida);
			extremosSoga.second->eliminarSoga(this->sogaUnida);
		}
		cout << "1elimino referencias de globo con soga id: "
				<< aBorrar->getIdElemento() << " y memoeria: " << aBorrar
				<< endl;
		cout << "Eliminar la soga con id: " << aBorrar->getIdElemento()
				<< " y memoria: " << aBorrar << endl;
		delete aBorrar;
		cout << "2222222elimino referencias de globo con soga id: "
				<< aBorrar->getIdElemento() << " y memoeria: " << aBorrar
				<< endl;
		aBorrar = NULL;
	}

}

void Globo::actualizarValoresFisicos() {
	Elemento::actualizarValoresFisicos();
	double posicionX, posicionY;
	posicionX = this->getX() + this->posSogaX;
	posicionY = this->getY() + this->posSogaY;
	if (this->sogaUnida) {
		if (sogaInicial) {
			this->sogaUnida->setPosicionInicial(posicionX, posicionY);
		} else {
			this->sogaUnida->setPosicionFinal(posicionX, posicionY);
		}
	}
}

void Globo::actualizarImagen() {
	GloboFisica* globoF = (GloboFisica*) this->getEntidadFisica();
	if (globoF->estaPinchado()
			&& this->getPathImagen().compare("img/globo_pinchado.png") != 0) {
		this->setPathImagen("img/globo_pinchado.png");
		this->eliminarImagenElemento();
	}
}

void Globo::pincharGlobo() {
	GloboFisica* globito = (GloboFisica*) this->getEntidadFisica();
	globito->pincharGlobo();
}

bool Globo::estaPinchado() {
	if (this->getEntidadFisica() != NULL) {
		GloboFisica* globito = (GloboFisica*) this->getEntidadFisica();
		return globito->estaPinchado();
	} else {
		return this->pinchado;
	}
}

void Globo::reproducirSonido(Sonido* sonido) {
	if (this->pinchado
			&& this->getPathImagen().compare("img/globo_pinchado.png") != 0) {
		cout << "Reproduce sonidooooooooooooo en globoo" << endl;
		//sonido->reproducirSonido();
	}
}

void Globo::actualizarImagenEnGlobo() {
	if (this->pinchado
			&& this->getPathImagen().compare("img/globo_pinchado.png") != 0) {

		this->setPathImagen("img/globo_pinchado.png");
		this->eliminarImagenElemento();
	}
	if (!this->pinchado
			&& this->getPathImagen().compare("img/globo_pinchado.png") == 0) {
		this->setPathImagen("img/globo.png");
		this->eliminarImagenElemento();
	}
}
